2025-11-18
데이터 레이어
국가 경계, 호수, 그래티큘: 벡터(vector) 데이터
인구밀도, 수심: 래스터(raster) 데이터
데이터 원천
Natural Earth Data: 국가 경계, 호수, 그래티큘, 수심
NASA’s Socioeconomic Data and Applications Center (SEDAC): 인구 밀도
투영법: 로빈슨 도법(Robinson projection)
지도화 기법: 컬러, 범례, 주기 표기 등
벡터(vector) 데이터
포인트, 라인, 폴리곤
형상 데이터 + 속성 데이터
래스터(raster) 데이터
그리드 셀(grid cell)
일체형
벡터 데이터: 형상 데이터 + 속성 데이터
형상 데이터 (기하, 도형, 공간 데이터)
지리공간적 객체 자체에 대한 데이터
포인트(점), 라인(선), 폴리곤(면)으로 구분
버텍스(vertex)의 좌표값
속성 데이터
지리공간적 객체가 보유한 속성
기존 일반 데이터와 동일
| 구분 | 함수 |
|---|---|
| 읽고 쓰기 |
st_read(), st_write(), read_sf(), write_sf()
|
| 투영 관련 |
st_crs(), st_transform()
|
| 기하 측정 |
st_area(), st_length(), st_perimeter(), st_distance()
|
| 기하 변형 |
st_centroid(), st_buffer(), st_boundary(), st_simplify()
|
| 기하 생성 |
st_point(), st_voronoi() , st_convex_hull(), st_make_grid()
|
| 기하 검토 |
st_is_valid(), st_make_valid()
|
| 기하 중첩 |
st_filter(), st_intersection(), st_union(), st_crop()
|
| 기타 |
st_coordinates(), st_cast(), st_as_sf(), st_graticule(), st_join()
|
속성 데이터
csv 파일: readr 패키지의 read_csv() 함수
엑셀 파일: readxl 패키지의 read_excel() 함수
Open API를 통해 수집: tibble 객체
형상 데이터와 속성 데이터의 결합: dplyr 패키지의 left_join() 함수
왼편: 형상 데이터
오른편: 속성 데이터
데이터 형식
패키지: terra 패키지
불러오기: rast()
변환하기: project(), mosaic(), crop()
계산하기: global(), focal(), zonal()
수 많은 다른 함수들
https://datacarpentry.github.io/organization-geospatial/03-crs.html
PROJ 정형문자열
EPSG 숫자코드
| 투영법 | PROJ 파라미터 |
|---|---|
| 정적원통 도법 Equal Area Cylindrical | +proj=cea |
| 컴펙트 밀러 도법 Compact Miller | +proj=comill |
| 에케르트 IV 도법 Eckert IV | +proj=eck4 |
| 정거원통 도법 Equidistant Cylindrical | +proj=eqc |
| 구드 도법 Goode Homolosine | +proj=goode |
| 단열형 구드 도법 Interrupted Goode Homolosine | +proj=igh |
| 메르카토르 도법 Mercator | +proj=merc |
| 몰바이데 도법 Mollweide | +proj=moll |
| 로빈슨 도법 Robinson | +proj=robin |
| 시뉴소이드 도법 Sinusoidal | +proj=sinu |
| 빈켈트리펠 도법 Winkel Tripel | +proj=wintri |
| 적용 스케일 | EPSG 숫자코드 | 설명 |
|---|---|---|
| 전세계 | EPSG:4326 | WGS84, 측지좌표계, GPS에 사용 |
| EPSG:3857 | 웹 메르카토르 도법, 구글 맵스, 오픈스트리트맵에서 사용 | |
| EPSG:7789 | ITRF2014 | |
| 미국 | EPSG:2163 | 알베르스 정적원추 도법 |
| 유럽 | EPSG:3035 | 람베르트 정적방위 도법 |
| 우리나라 | EPSG:5179 | UTM-K |
| EPSG:5185 | 서부원점 | |
| EPSG:5186 | 중부원점 | |
| EPSG:5187 | 동부원점 | |
| EPSG:5188 | 동해원점 |
ggplot() +
geom_sf(data = world) +
geom_sf(data = ne_bbox, fill = NA) +
coord_sf(crs = "+proj=eqc") +
scale_x_continuous(breaks = seq(-180, 180, 30)) +
scale_y_continuous(breaks = c(-89.9, seq(-60, 60, 30), 89.9)) +
theme(
panel.background = element_rect("white"),
panel.grid = element_line(color = "gray80")
)
ggplot() +
geom_sf(data = world) +
geom_sf(data = ne_bbox, fill = NA) +
coord_sf(crs = "+proj=comill") +
scale_x_continuous(breaks = seq(-180, 180, 30)) +
scale_y_continuous(breaks = c(-89.9, seq(-60, 60, 30), 89.9)) +
theme(
panel.background = element_rect("white"),
panel.grid = element_line(color = "gray80")
)
ggplot() +
geom_sf(data = world) +
geom_sf(data = ne_bbox, fill = NA) +
coord_sf(crs = "+proj=robin") +
scale_x_continuous(breaks = seq(-180, 180, 30)) +
scale_y_continuous(breaks = c(-89.9, seq(-60, 60, 30), 89.9)) +
theme(
panel.background = element_rect("white"),
panel.grid = element_line(color = "gray80")
)
ggplot() +
geom_sf(data = world) +
geom_sf(data = ne_bbox, fill = NA) +
coord_sf(crs = "+proj=eck4") +
scale_x_continuous(breaks = seq(-180, 180, 30)) +
scale_y_continuous(breaks = c(-89.9, seq(-60, 60, 30), 89.9)) +
theme(
panel.background = element_rect("white"),
panel.grid = element_line(color = "gray80")
)
정적(static) 지도
동적(animated) 지도
인터랙티브(interactive) 지도
plotly 패키지의 ggplotly() 함수
ggiraph 패키지
leaflet 패키지: Leaflet JS 라이브러리의 래퍼 패키지
world_map <- ggplot() +
geom_sf(data = world_data, aes(fill = TFR, text = name_long)) +
coord_sf(crs = "+proj=robin") +
scale_fill_viridis_c() +
scale_x_continuous(breaks = seq(-180, 180, 30)) +
scale_y_continuous(breaks = c(-89.5, seq(-60, 60, 30), 89.5)) +
theme(
panel.background = element_rect("white"),
panel.grid = element_line(color = "gray80")
)
world_map
library(tmap)
tm_world_map <- tm_shape(world_data, crs = "+proj=robin") +
tm_graticules(
labels.show = FALSE,
x = seq(-180, 180, 30),
y = c(-89.5, seq(-60, 60, 30), 89.5)
) +
tm_polygons(
fill = "TFR",
fill.scale = tm_scale_continuous(values = "viridis")
) +
tm_layout(frame = FALSE)
tm_world_map
library(ggspatial)
sigungu_data <- sigungu_data |>
mutate(
index_class = case_when(
index < 0.2 ~ "1",
index >= 0.2 & index < 0.5 ~ "2",
index >= 0.5 & index < 1.0 ~ "3",
index >= 1.0 & index < 1.5 ~ "4",
index >= 1.5 ~ "5"
),
index_class = fct(index_class, levels = as.character(1:5))
)
class_color <- c("1" = "#d7191c", "2" = "#fdae61",
"3" = "#ffffbf", "4" = "#a6d96a",
"5" = "#1a9641")
ggplot_map <- ggplot() +
geom_sf(
data = sigungu_data,
aes(fill = index_class, text = SGG1_FNM),
show.legend = TRUE
) +
geom_sf(
data = sido_shp,
fill = NA,
lwd = 0.5
) +
scale_fill_manual(
name = "Classes",
labels = c("< 0.2", "0.2 ~ 0.5", "0.5 ~ 1.0",
"1.0 ~ 1.5", ">= 1.5"),
values = class_color, drop = FALSE
) +
annotation_scale(
location = "br",
bar_cols = c("gray40", "white"),
width_hint = 0.4
)
ggplot_map
class_color <- c("#d7191c", "#fdae61", "#ffffbf", "#a6d96a", "#1a9641")
tmap_map <- tm_graticules(labels.cardinal = TRUE) +
tm_shape(sigungu_data) +
tm_polygons(
fill = "index", id = "SGG1_FNM",
fill.scale = tm_scale_intervals(
values = class_color,
breaks = c(0, 0.2, 0.5, 1.0, 1.5, Inf),
labels = c("< 0.2", "0.2 ~ 0.5", "0.5 ~ 1.0",
"1.0 ~ 1.5", ">= 1.5")
),
fill.legend = tm_legend(title = "Classes")
) +
tm_shape(sido_shp) + tm_borders(lwd = 1.5) +
tm_scalebar(breaks = seq(0, 200, 50))
tmap_map
ggplotly() 함수library(ggiraph)
sigungu_data <- sigungu_data |>
mutate(
index = format(index, digits = 4, nsmall = 4),
my_tooltip = str_c("Name: ", SGG1_FNM, "\n Index: ", index)
)
gg <- ggplot() +
geom_sf_interactive(
data = sigungu_data,
aes(fill = index_class, tooltip = my_tooltip, data_id = SGG1_FNM),
show.legend = TRUE
) +
geom_sf(data = sido_shp, fill = NA, lwd = 0.5) +
scale_fill_manual(
name = "Classes",
labels = c("< 0.2", "0.2 ~ 0.5", "0.5 ~ 1.0", "1.0 ~ 1.5", ">= 1.5"),
values = class_color, drop = FALSE
)
girafe(ggobj = gg) |>
girafe_options(opts_hover(css = "fill: gray"))library(leaflet)
world_data <- world_data |> filter(!is.na(TFR))
bins <- c(0, 1.5, 2.1, 3, 4, 5, Inf)
pal <- colorBin("YlOrRd", domain = world_data$TFR, bins = bins)
labels <- sprintf("<strong>%s</strong><br/>%g",
world_data$name_long, world_data$TFR) |> lapply(htmltools::HTML)
leaflet(world_data) |>
addProviderTiles(providers$Esri.WorldTopoMap) |>
addPolygons(
fillColor = ~pal(TFR), weight = 2, opacity = 1, color = "white",
dashArray = "3", fillOpacity = 0.6,
highlightOptions = highlightOptions(
weight = 5, color = "#666", dashArray = "",
fillOpacity = 0.6, bringToFront = TRUE
),
label = labels,
labelOptions = labelOptions(
style = list("font-weight" = "normal", padding = "3px 8px"),
textsize = "15px", direction = "auto"
)
) |>
addLegend(
pal = pal, values = ~TFR, opacity = 0.6, title = NULL, position = "bottomright"
)library(leaflet)
world_data <- world_data |> filter(!is.na(TFR))
bins <- c(0, 1.5, 2.1, 3, 4, 5, Inf)
pal <- colorBin("YlOrRd", domain = world_data$TFR, bins = bins)
labels <- sprintf("<strong>%s</strong><br/>%g",
world_data$name_long, world_data$TFR) |> lapply(htmltools::HTML)
leaflet(world_data) |>
addProviderTiles(providers$Esri.WorldTopoMap) |>
addPolygons(
fillColor = ~pal(TFR), weight = 2, opacity = 1, color = "white",
dashArray = "3", fillOpacity = 0.6,
highlightOptions = highlightOptions(
weight = 5, color = "#666", dashArray = "",
fillOpacity = 0.6, bringToFront = TRUE
),
label = labels,
labelOptions = labelOptions(
style = list("font-weight" = "normal", padding = "3px 8px"),
textsize = "15px", direction = "auto"
)
) |>
addLegend(
pal = pal, values = ~TFR, opacity = 0.6, title = NULL, position = "bottomright"
)library(tmap)
class_color <- c("#d7191c", "#fdae61", "#ffffbf", "#a6d96a", "#1a9641")
sigungu_data <- sigungu_data |> mutate(index = as.numeric(index))
tmap_mode(mode = "view")
my_tmap <- tm_shape(sigungu_data) +
tm_polygons(
fill = "index", fill_alpha = 0.6, col_alpha = 0.5,
popup.vars = c("지역소멸위험지수: " = "index"),
popup.format = list(index = list(digits = 3)),
id = "SGG1_FNM",
fill.scale = tm_scale_intervals(
values = class_color, breaks = c(0, 0.2, 0.5, 1.0, 1.5, Inf),
labels = c("< 0.2", "0.2~0.5", "0.5~1.0", "1.0~1.5", ">= 1.5")
),
fill.legend = tm_legend(title = "Classes")
) +
tm_shape(sido_shp) + tm_borders(lwd = 2)
my_tmapclass_color <- c("#d7191c", "#fdae61", "#ffffbf", "#a6d96a", "#1a9641")
sigungu_data <- sigungu_data |> mutate(index = as.numeric(index))
tmap_mode(mode = "view")
my_tmap <- tm_shape(sigungu_data) +
tm_polygons(
fill = "index", fill_alpha = 0.6, col_alpha = 0.5,
popup.vars = c("지역소멸위험지수: " = "index"),
popup.format = list(index = list(digits = 3)),
id = "SGG1_FNM",
fill.scale = tm_scale_intervals(
values = class_color, breaks = c(0, 0.2, 0.5, 1.0, 1.5, Inf),
labels = c("< 0.2", "0.2~0.5", "0.5~1.0", "1.0~1.5", ">= 1.5")
),
fill.legend = tm_legend(title = "Classes")
) +
tm_shape(sido_shp) + tm_borders(lwd = 2)
my_tmaphttps://www.geeksforgeeks.org/artificial-intelligence/large-language-model-llm/
LLM을 웹 인터페이스에서 사용하는 것이 아니라, 코드로 직접 제어하고 자동화하는 방식
API(Application Programming Interface, 응용프로그램 프로그래밍 인터페이스)
응용프로그램(예: 웹 앱)이 프로그래밍을 통해 다른 프로그램이나 서비스(예: ChatGPT)와 상호작용하도록 해 주는 접점
HTTP 요청(POST) + JSON 구조로 메시지 전달
모델 이름, 메시지, 파라미터를 코드로 지정
응답은 JSON 형태의 텍스트/토큰
대량 처리, 반복 처리, 자동화, 소프트웨어 통합
요청(request) 구성 요소
Base URL: 모델 서버의 접속 주소, https://api.openai.com/v1
모델 이름: gpt-5.1
API Key (인증): 사용자 신원 증명 토큰
메시지: 모델에 보낼 내용, JSON 배열로 구성
응답(response) 구성 요소
모델 출력 텍스트: 모델이 생성한 실제 답변
토큰 사용량: 과금 및 모델 내부 처리량 계산에 사용
메시지 구조(JSON)
Google AI Studio(https://aistudio.google.com/app/) 접속
왼쪽 하단에서 Get API Key 클릭
오른쪽 상단에서 API 키 만들기 클릭
새 키 만들기 창
키 이름 지정: 이름 지정
가져온 프로젝트 선택: 프로젝트 가져오기 혹은 프로젝트 만들기
오른쪽 아이콘 중 Copy API key 선택
콘솔: usethis::edit_r_environ() 실행
.Renviron 파일
GEMINI_API_KEY=your_key_here
저장
Session > Restart R 실행
library(ellmer)
chat <- chat_google_gemini(
base_url = "https://generativelanguage.googleapis.com/v1beta/",
api_key = Sys.getenv("GEMINI_API_KEY"),
model = "gemini-2.5-flash",
system_prompt = ""
)
chat$chat("서울대학교 AI융합교육학과를 소개해주세요.")library(ellmer)
chat <- chat_google_gemini(
base_url = "https://generativelanguage.googleapis.com/v1beta/",
api_key = Sys.getenv("GEMINI_API_KEY"),
model = "gemini-2.5-flash",
system_prompt = ""
)
chat$chat("서울대학교 AI융합교육학과를 소개해주세요.")서울대학교 AI융합교육학과는 4차 산업혁명 시대를 맞아 인공지능(AI) 기술이 교육 분야에 미치는 영향이 증대됨에 따라, **AI와 교육학을
융합하여 미래 교육을 선도할 창의적 인재를 양성하기 위해 설립된 혁신적인 학과**입니다.
특히, 서울대학교 **사범대학 소속**으로, 교육학적 통찰과 인공지능 기술에 대한 깊은 이해를 동시에 갖춘 전문가 양성을 목표로 합니다.
### 주요 특징 및 목표
1. **AI와 교육학의 융합:**
* 단순히 AI 기술을 교육에 접목하는 것을 넘어, 교육학적 이론과 인공지능 기술을 심층적으로 융합하여 새로운 교육 패러다임을
제시하고 실현하는 데 중점을 둡니다.
* 인공지능 기반 학습 시스템 개발, 맞춤형 교육 콘텐츠 기획, 교육 데이터 분석, AI 교육과정 개발 등 다양한 융합 연구 및
실천 역량을 키웁니다.
2. **미래 교육 리더 양성:**
* 급변하는 사회에서 AI 시대에 필요한 교육의 방향성을 제시하고, 교육 현장의 변화를 주도할 수 있는 리더를 양성합니다.
* 이를 위해 AI 윤리, AI 교육 정책, 미래 사회 변화와 교육의 역할 등 폭넓은 시야를 갖추도록 교육합니다.
3. **학제 간 연구 및 협력:**
* 서울대학교 내 컴퓨터공학, 통계학, 인지과학 등 다양한 AI 관련 학과 및 연구소와의 협력은 물론, 교육학 분야의 깊이 있는
연구 역량을 결합하여 시너지를 창출합니다.
4. **실천 중심의 교육:**
* 이론적 지식뿐만 아니라 실제 교육 현장에 AI를 적용하고 문제를 해결할 수 있는 실천적 역량을 강조합니다. AI 기반 교육
솔루션 기획 및 개발, 교육 데이터 분석 및 활용 능력 등을 함양합니다.
### 교육 내용 (주요 커리큘럼 분야)
* **인공지능 핵심 기술:** 머신러닝, 딥러닝, 데이터 과학 및 분석
* **교육학 이론:** 학습 과학, 교수 설계, 교육 심리, 교육 과정 및 평가
* **AI 융합 교육:** AI 기반 학습 시스템 설계, 에듀테크(EdTech) 개발, 교육 데이터 마이닝, 지능형 튜터링 시스템,
가상/증강현실(VR/AR) 기반 학습, AI 윤리 및 정책
* **교육 콘텐츠 개발:** AI 시대에 맞는 새로운 교육 콘텐츠 및 교수법 개발
* **연구 방법론:** 교육 연구 방법, 데이터 기반 교육 연구
### 졸업 후 진로
AI융합교육학과 졸업생들은 다음과 같은 분야에서 핵심 인재로 활동할 수 있습니다.
* **에듀테크(EdTech) 기업:** AI 기반 학습 솔루션 개발자, 교육 콘텐츠 기획자, 데이터 분석가
* **교육 관련 연구기관:** 교육 정책 연구원, 미래 교육 시스템 연구원
* **정부 및 공공기관:** 교육부, 시도교육청 등 교육 행정 전문가
* **기업 교육 및 HRD:** 기업 내 교육 프로그램 개발 및 운영, 인재 개발 전문가
* **학계 및 연구원:** AI 융합 교육 분야 교수, 연구원
* **학교 현장:** AI 교육 전문가, AI 기반 교육 프로그램 운영자 (관련 자격증 취득 시)
서울대학교 AI융합교육학과는 인공지능 시대의 교육적 난제를 해결하고 새로운 가능성을 열어갈, 미래 교육을 디자인하는 핵심적인 역할을 수행할
인재를 양성하는 데 주력하고 있습니다.
Ollama 홈페이지 접속: https://ollama.com/
Download 클릭
모델 다운로드: Windows PowerShell 실행
ollama pull gemma3:4b실행
library(ellmer)
chat <- chat_ollama(
base_url = "http://localhost:11434",
model = "gemma3:4b",
system_prompt = ""
)
chat$chat("서울대학교 AI융합교육학과를 소개해주세요.")library(ellmer)
chat <- chat_ollama(
base_url = "http://localhost:11434",
model = "gemma3:4b",
system_prompt = ""
)
chat$chat("서울대학교 AI융합교육학과를 소개해주세요.")서울대학교 AI융합교육학과(AI Fusion Education Program)는 인공지능(AI) 기술의 발전과 함께 교육 분야에도 큰 변화가
일어나고 있는 가운데, 이러한 변화에 적극적으로 대응하고 미래 교육을 선도할 인재를 양성하기 위해 설립된 학과입니다. 2023년 9월
신설되었으며, AI 기술과 교육의 융합적 접근을 통해 혁신적인 교육 모델을 창출하고, 미래 교육의 새로운 지평을 열어갈 핵심 인재를 육성하는
것을 목표로 합니다.
**1. 학과의 특징:**
* **융합 교육:** AI 기술과 교육학, 심리학, 디자인, 콘텐츠 제작 등 다양한 분야를 융합하여 미래 교육의 핵심 역량을 갖춘 인재를
양성합니다.
* **실험적인 교육 과정:** 이론 중심의 교육에서 벗어나, 실제 AI 기술을 활용한 교육 프로그램 개발 및 훈련 과정을 통해 실질적인 문제
해결 능력을 키웁니다.
* **AI 기반 교육 솔루션 개발:** 학생들은 AI 기술을 활용하여 교육 콘텐츠를 개발하고, 학습 분석 시스템을 구축하며, 개인 맞춤형
학습 시스템을 설계하는 등 실제 교육 솔루션 개발 경험을 쌓습니다.
* **산학협력:** 국내외 유수 기업 및 연구기관과의 협력을 통해 AI 교육 분야의 최신 기술 동향을 학습하고, 기업 현장에서 필요한 교육
전문가를 양성합니다.
* **다양한 분야의 전문가 교원:** AI, 교육학, 디자인, 콘텐츠 제작 등 다양한 분야의 전문가들이 함께 학생들을 지도하며, 융합적 사고
능력을 함양하도록 돕습니다.
**2. 교육 과정:**
* **주요 전공:** AI융합교육, 교육학, 심리학, 디자인, 콘텐츠 제작 등
* **선교과목:** 인공지능, 머신러닝, 딥러닝, 교육 공학, 인간-컴퓨터 상호작용, 교육 심리학, 디자인 씽킹, 게임 디자인, 콘텐츠
제작, 데이터 분석 등
* **핵심 교육 과정:**
* **AI 기초:** AI 기술의 기본 원리 및 활용 방법 학습
* **교육 공학:** 교육 기술의 이론 및 실제 학습
* **인간-컴퓨터 상호작용:** 인간과 AI의 효율적인 협업을 위한 기술 및 설계 방법 학습
* **교육 디자인:** AI 기반 교육 콘텐츠 및 프로그램 개발 기법 학습
* **데이터 분석:** 교육 데이터 분석을 통한 학습 효과 측정 및 개선 방안 도출
**3. 졸업 목표:**
* AI 기반 교육 콘텐츠 및 프로그램 개발 전문가
* AI 교육 시스템 설계 및 운영 전문가
* 교육 데이터 분석 및 활용 전문가
* 교육 정책 및 전략 개발 전문가
* AI 교육 관련 연구 개발 전문가
**4. 더 자세한 정보는 다음 링크에서 확인하실 수 있습니다:**
* **서울대학교 AI융합교육학과 홈페이지:**
[https://ai-fusion.snu.ac.kr/](https://ai-fusion.snu.ac.kr/)
* **서울대학교 뉴스 기사:**
[https://news.snu.ac.kr/ko/search?search_keyword=AI%20Fusion%20Education%20Program](https://news.snu.ac.kr/ko/search?search_keyword=AI%20Fusion%20Education%20Program)
궁금한 점이 있다면 언제든지 다시 질문해주세요.

https://sangillee.snu.ac.kr/